/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "core/引擎配置.h"
#include "core/shader_built_in_functions.h"
#include "底层绘图/intern/绘图框架.h"
#include "底层绘图/intern/Vulkan/Vulkan框架.h"
#include "UI/Widget.h"
#include "3D预设材质.h"



S_材质管线* f_mtl_创建3D线管_面(S_设备环境& Ctx, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
		},
		{
			{S_引擎配置::m_3D着色器文件根路径 + "Face.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_3D着色器文件根路径 + "Face.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			rf->m_着色布局设置_VS_Proj,
			rf->m_着色布局设置_VS_Mat4,
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Mesh_Face)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_绘制方式 = E_绘制方式::e_三角形;
	线管参数.m_采样 = E_MS次数::e_MS_1;


	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线(&Ctx);
	uint32 mask = E_管线槽::e_颜色渲染 | E_管线槽::e_环境渲染 | E_管线槽::e_阴影渲染 | E_管线槽::e_几何渲染;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数,  mask);

	std::vector<C_DescriptorSet*> 描述符集;
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Proj);
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Mat4);
	f_df_构建着色器描述符集(材质->m_着色线管, 描述符集);
	return 材质;
}

S_材质管线* f_mtl_创建3D线管_点(S_设备环境& Ctx, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
		},
		{
			{S_引擎配置::m_3D着色器文件根路径 + "Point.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_3D着色器文件根路径 + "Point.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			rf->m_着色布局设置_VS_Proj,
			rf->m_着色布局设置_VS_Mat4,
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Mesh_Point)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充点;
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_采样 = E_MS次数::e_MS_1;
	

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线(&Ctx);
	uint32 mask = E_管线槽::e_颜色渲染 | E_管线槽::e_环境渲染 | E_管线槽::e_阴影渲染 | E_管线槽::e_几何渲染;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数, mask);

	std::vector<C_DescriptorSet*> 描述符集;
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Proj);
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Mat4);
	f_df_构建着色器描述符集(材质->m_着色线管, 描述符集);
	return 材质;
}



S_材质管线* f_mtl_创建3D线管_线(S_设备环境& Ctx, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
		},
		{
			{S_引擎配置::m_3D着色器文件根路径 + "Line.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_3D着色器文件根路径 + "Line.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			rf->m_着色布局设置_VS_Proj,
			rf->m_着色布局设置_VS_Mat4,
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Mesh_Line)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_绘制方式 = E_绘制方式::e_画线段;
	线管参数.m_采样 = E_MS次数::e_MS_1;
	

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线(&Ctx);
	uint32 mask = E_管线槽::e_颜色渲染 | E_管线槽::e_环境渲染 | E_管线槽::e_阴影渲染 | E_管线槽::e_几何渲染;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数,  mask);

	std::vector<C_DescriptorSet*> 描述符集;
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Proj);
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Mat4);
	f_df_构建着色器描述符集(材质->m_着色线管, 描述符集);
	return 材质;
}

S_材质管线* f_mtl_创建3D线管_盒(S_设备环境& Ctx, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
		},
		{
			{S_引擎配置::m_3D着色器文件根路径 + "Cube.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_3D着色器文件根路径 + "Cube.gspv", {}, E_着色阶段::e_几何着色},	
			{S_引擎配置::m_3D着色器文件根路径 + "Cube.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			rf->m_着色布局设置_VS_Proj,
			rf->m_着色布局设置_VS_Mat4,
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Mesh_Line)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_采样 = E_MS次数::e_MS_1;


	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线(&Ctx);
	uint32 mask = E_管线槽::e_颜色渲染 | E_管线槽::e_环境渲染 | E_管线槽::e_阴影渲染 | E_管线槽::e_几何渲染;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数,  mask);

	std::vector<C_DescriptorSet*> 描述符集;
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Proj);
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Mat4);
	f_df_构建着色器描述符集(材质->m_着色线管, 描述符集);
	return 材质;
}


S_材质管线* f_mtl_创建网格刻度管线(S_设备环境& Ctx, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);
	S_材质管线* 材质 = new S_材质管线();

	S_着色器管线创建参数 图元配置 = {
		{ },
		{
			{S_引擎配置::m_3D着色器文件根路径 + "刻度网格.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_3D着色器文件根路径 + "刻度网格.gspv", {}, E_着色阶段::e_几何着色},
			{S_引擎配置::m_3D着色器文件根路径 + "刻度网格.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			rf->m_着色布局设置_VS_Proj,
			rf->m_着色布局设置_VS_Mat4,
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Mesh_GraduationLine)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_采样 = E_MS次数::e_MS_1;


	f_df_设置线管混合模式(线管参数, 混合模式);

	uint32 mask = E_管线槽::e_颜色渲染 | E_管线槽::e_环境渲染;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数, mask);

	std::vector<C_DescriptorSet*> 描述符集;
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Proj);
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Mat4);
	f_df_构建着色器描述符集(材质->m_着色线管, 描述符集);
	return 材质;
}

S_材质管线* f_mtl_创建3D注视牌管线(S_设备环境& Ctx, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);
	//auto* rc = f_vk_get绘图环境(Ctx);


	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
		},
		{
			{S_引擎配置::m_3D着色器文件根路径 + "Line.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_3D着色器文件根路径 + "Line.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			rf->m_着色布局设置_VS_Proj,
			rf->m_着色布局设置_VS_Mat4,
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Mesh_Line)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_绘制方式 = E_绘制方式::e_画线段;
	线管参数.m_采样 = E_MS次数::e_MS_1;
	

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线(&Ctx);
	uint32 mask = E_管线槽::e_颜色渲染 | E_管线槽::e_环境渲染 | E_管线槽::e_阴影渲染 | E_管线槽::e_几何渲染;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数, mask);

	//C_VkDescriptorSet* ds = new C_VkDescriptorSet();
	std::vector<C_DescriptorSet*> 描述符集;
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Proj);
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Mat4);
	f_df_构建着色器描述符集(材质->m_着色线管, 描述符集);
	return 材质;
}




S_材质管线* f_mtl_场景单色光照管线(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式, E_填充模式 填充模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{1,sizeof(vec3),0,E_数据格式::e_F_RGB},
			{2,sizeof(vec3),0,E_数据格式::e_F_RGB},
		},
		{
			{S_引擎配置::m_3D着色器文件根路径 + "基本光照点.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_3D着色器文件根路径 + "基本光照点.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			rf->m_着色布局设置_VS_Proj,
			rf->m_着色布局设置_VS_Mat4,
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Mesh_Face)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = 填充模式;
	线管参数.m_绘制方式 = E_绘制方式::e_三角形;
	线管参数.m_采样 = 采样;

	f_df_设置线管混合模式(线管参数, 混合模式);

	//S_结构对象* layout[4] = {	rf->m_管线参数设置_VS_Proj, 
	//	rf->m_管线参数设置_VS_Mat4,
	//};

	S_材质管线* 材质 = new S_材质管线();
	uint32 mask = E_管线槽::e_颜色渲染 | E_管线槽::e_环境渲染 | E_管线槽::e_阴影渲染 | E_管线槽::e_几何渲染;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数, mask);


	std::vector<C_DescriptorSet*> 描述符集;
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Proj);
	描述符集.push_back(rf->m_场景渲染环境->m_管线参数设置_VS_Mat4);
	f_df_构建着色器描述符集(材质->m_着色线管, 描述符集);
	return 材质;
}



